 package com.cypher.encryptionanddecryption.util;

import com.cypher.encryptionanddecryption.bluetooth.BluetoothGattManager;

import org.apache.commons.lang3.StringUtils;

 /**
  * 2.5通信协议工具类
  * @author: 古霸天
  * @date: 2020/11/17
  */
 public class Nb25ProtocolUtils {

     /**
      * 读数据控制域（读数据采用明文格式读取）
      */
     public static String READ_CONTROL = "84";
     /**
      * 写数据控制域（写数据采用密文方式写入）
      */
     public static String WRITE_CONTROL = "85";
     /**
      * 消息序号
      */
     public static String MESSAGE_NUMBER = "00";

     public static String key = "";
     public static String random = "";

     /**
      * 获取协议读数据发送码
      * @param comm
      * @param protocolTypeAndVersion 协议类型及协议框架版本
      * @return
      */
     public static String getReadCommand(String comm, String protocolTypeAndVersion) {

         return getCommand(comm, "", READ_CONTROL, protocolTypeAndVersion, 1);
     }
     /**
      * 获取协议写数据发送码
      * @param comm
      *     数据对象ID
      * @param commData
      *       控制域
      * @return
      */
     public static String getWriteCommand(String comm, String commData, String protocolTypeAndVersion) {

         return getCommand(comm, commData, WRITE_CONTROL, protocolTypeAndVersion, 4);

     }
     public static String getCommand(String comm, String commData, String commControl, String protocolTypeAndVersion, int keyType) {

         return getCommand(MESSAGE_NUMBER, comm, commData, commControl, protocolTypeAndVersion, keyType);
     }

     /**
      * 组包
      * @param message 消息序号
      * @param comm 数据域ID
      * @param commData 数据域
      * @param commControl 控制域
      * @param protocolTypeAndVersion 协议框架版本
      * @param keyType 密文类型
      * @return
      */
     public static String getCommand(String message, String comm, String commData, String commControl, String protocolTypeAndVersion, int keyType) {

         //密文 + MAC
         if (keyType == 4) {
             String macKey = AESUtils.encrypt(key, random).substring(0, 32);
             commData = AESUtils.encrypt(key, commData);
             try {
                 commData += AESUtils.HMACSHA256(macKey, random + commData);
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }

         // 消息序号 + 控制域 + 数据域ID + 数据域
         String data = message + commControl + comm + commData;

         // 数据进行CRC处理
         String crc16 = HexUtils.crc16(HexUtils.hexToBytes(data));

         // 计算帧长度，为整帧长度
         String fragmentLength = HexUtils.paddingLeft(Integer.toHexString((data.length() / 2 + 8)), 4).toUpperCase();

         // 帧头 + 协议类型,协议框架版本 + 帧长度 + （消息序号 + 控制域 + 数据域ID + 数据域） + 校验域 + 帧尾
         data = ProtocolUtils.con188Star + protocolTypeAndVersion + fragmentLength + data + crc16 + ProtocolUtils.con188End;

         return data;
     }

     /**
      * 格式化NB2.5数据
      * @param data
      * @return
      */
     public static String formatReceiveData(String data) {
         int index = data.indexOf("68");
         // 截取多余的头帧
         data = StringUtils.substring(data, index);
         return StringUtils.substring(data, 18, data.length() - 6);
     }

     /**
      * 校验写入数据是否成功
      * @param data
      * @return
      */
     public static boolean checkWriteDataStatus(String data) {
         // 格式化数据
         String formatData = formatReceiveData(data);
         if (StringUtils.equals("0000" , formatData)) {
             return true;
         }
         return false;
     }

 }
